package providers

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"time"
)

const cMysqlHeartbeat = 60

var Mysql *gorm.DB

/**
 * @Author: yang
 * @Description：初始化
 * @Date: 2021/10/18 17:16
 */
func init() {
	if !Config.GetBool("mysql.isStart") {
		return
	}

	var err error
	Mysql, err = getMysqlClient()
	if err != nil {
		panic("数据库初始化打开失败:" + err.Error())
	}

	Mysql.DB().Ping()

	// 心跳
	go mysqlHeartbeatRun()
}

/**
 * @Author: yang
 * @Description：获取 mysql 客户端
 * @Date: 2021/10/18 19:09
 */
func getMysqlClient() (*gorm.DB, error) {
	config := Config.GetStringMapString("mysql")
	protocol := fmt.Sprintf(
		"%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
		config["user"],
		config["password"],
		config["host"],
		config["dbname"],
	)

	return gorm.Open("mysql", protocol)

}

/**
 * @Author: yang
 * @Description： 重置 mysql 客户端
 * @Date: 2021/10/18 19:10
 */
func resetMysqlClient() {
	if Mysql != nil {
		Mysql.Close()
	}

	var err error
	Mysql, err = getMysqlClient()
	if err != nil {
		Logger.Errorf("数据库初始化打开失败!%s", err.Error())
	}
}

/**
 * @Author: yang
 * @Description： mysql 心跳
 * @Date: 2021/10/18 19:10
 */
func mysqlHeartbeatRun() {
	timer := time.NewTicker(cMysqlHeartbeat * time.Second)
	for {
		select {
		case <-timer.C: // 每一分钟 ping 一次
			if err := Mysql.DB().Ping(); err != nil {
				Logger.Errorf("mysql 无法 ping 通!%s", err.Error())
				resetMysqlClient()
			}
		}
	}
}
